package controllers;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

import models.Periodo_Envio;
import models.Plantilla_Base;
import java.util.List;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.write.*;
import models.*;
import play.Logger;
import play.db.jpa.GenericModel.JPAQuery;
import play.mvc.Controller;
import play.mvc.Scope;
//import play.modules.excel.Excel.*;


public class dptoAcademico extends Controller {

    public static SemestreAcademico SA2 = new SemestreAcademico();

    public static void extraerPeriodo() {
        String mensaje = "";
        //Extraemos la fecha de inicio y fin del ciclo academico
        SemestreAcademico SA = SemestreAcademico.find("order by id DESC").first();
       
        if(SA==null){
            SA = new SemestreAcademico();
        }
         SA2 = SA;
        //extraemos los datos del ultimo periodo de envio
        Periodo_Envio PE = Periodo_Envio.find("order by id DESC").first();

        if (PE == null) {
            mensaje = "Aun no se han registrado semestres.";
            PE = new Periodo_Envio();
        }

        //extraemos el ultimo registro llenado por el Jefe de Departamento los datos del ultimo registro de Plantilla Base
        Plantilla_Base pUl = Plantilla_Base.find("order by id DESC").first();

        List<Plantilla_Base> PB = llenarPlantilla();
        if (pUl == null) {
            mensaje = "Aun no se han registrado semestres.";
            //PB = 
        } else {
            PB = Plantilla_Base.find("pla_iCodigo", pUl.pla_iCodigo).fetch();
            //Imprimimos el contenido de la lista  
            Plantilla_Base Temp = new Plantilla_Base();
            Iterator iter = PB.iterator();
            while (iter.hasNext()) {
                Temp = (Plantilla_Base) iter.next();
                //System.out.println(Temp.dia_iId + "  " + Temp.pla_sElegido + Temp.pla_iCodigo + "  " + Temp.pla_iHoraInicioClases + "  " + Temp.pla_iHoraFinClases);
            }
           
        }
        
     
                
        
        //System.out.println("Nombre "+SA.sem_vcNombre+ "  ini "+SA.getInicio() );

        Logger.info("Inicio");
        render(PB,PE,SA,mensaje);
        
    }
    

    public static void registrarPeriodo(Periodo_Envio PE) {
        PE.sem_nombre = SA2.sem_vcNombre;
//        System.out.println("nom :" + PE.sem_nombre);
//        System.out.println("ini " + PE.per_datFechaInicio);
//        System.out.println("fin " + PE.per_datFechaFin);
        //show2(PE.id);
        PE.save();
        recargarPeriodo();
        //extraerPeriodo(PE.id);
    }

 

    public static void recargarPeriodo() {
        extraerPeriodo();
    }

    public static void jefeDptoAcademico() {
        render();
    }

    private static List<Plantilla_Base> llenarPlantilla() {
        List<Plantilla_Base> tmp= new ArrayList<Plantilla_Base>();
        for (int i = 0; i < 7; i++) {
            tmp.add(new Plantilla_Base(123, "si", i, 7, 22));
        }
        return tmp;
    }
    
    //metodo que registra los dias y horas de Clases
public static void registrarDiasHorasClase(){
        long pos;
        //Extraemos el ultimo id de los cursos
        Plantilla_Base Temp = Plantilla_Base.find("order by pla_iCodigo DESC").first();
        if(Temp!=null){
            pos = Temp.id + 1;
        }else{
            pos = 111;
        }
        
        
        Plantilla_Base PB;
        String s1,s2,s3;
        for(int i=0;i<7;i++){
            //Dia elegido
            s1 = params.get("dia["+i+"]");
            //Hora de inicio de las clases del día elegido
            s2 = params.get("ini_dia["+i+"]");
            //Hora de Fin de las clases del día elegido
            s3 = params.get("fin_dia["+i+"]");

                PB = new Plantilla_Base(pos,s1,i, Integer.parseInt(s2),Integer.parseInt(s3));
                
               // System.out.println("dia: ["+i+"]" + s1 +" cod: ["+pos+"]" +" Inicio "+ params.get("ini_dia["+i+"]")+ " Finaliza " + params.get("fin_dia["+i+"]"));
                PB.save();    
        }        
        
        recargarPeriodo();
    }
    
//    public static void listaDocentes(){
//        String mensaje = "exito";
//          //Extraemos la fecha de inicio y fin del ciclo academico
//        SemestreAcademico SA = SemestreAcademico.find("order by id DESC").first();
//        SA2 = SA;
//        if(SA==null){
//            System.out.println("Esta Vacio.....");
//            SA = new SemestreAcademico();
//        }
//        
//        //extraemos los datos del Jefe de Departamento
//        Docente JD = Docente.find("doc_vcCodigo","000000").first();
//        
//        
//        List<Docente> DC = Docente.find("order by id DESC").fetch();
//        if (DC == null) {
//            mensaje = "Aun no se han registrado disponibilidades.";
//            //PB = 
//        } else {
//           
//            //Imprimimos el contenido de la lista de Docentes 
////            Docente Temp = new Docente();
////            Iterator iter = DC.iterator();
////            while (iter.hasNext()) {
////                Temp = (Docente) iter.next();
////            }
//           
//        }
//        render(DC, mensaje,SA );
//    }
    
    public static void listaDocentes(){
        String mensaje = "exito";
          //Extraemos la fecha de inicio y fin del ciclo academico
        SemestreAcademico SA = SemestreAcademico.find("order by id DESC").first();
        SA2 = SA;
        if(SA==null){
            System.out.println("Esta Vacio.....");
            SA = new SemestreAcademico();
        }
        
        //extraemos los datos del Jefe de Departamento
        Docente JD = Docente.find("doc_vcCodigo","000000").first();
        
        List<Docente> docentes = new ArrayList<Docente>();
        List<Docente> DC2 = Docente.find("order by id DESC").fetch();
        int a = docentes.size();
        List<envioDiponibilidad> DC = new ArrayList<envioDiponibilidad>();
        
        for (Docente docente : DC2) {
                                
            JPAQuery query  = registroEnviados.find(" cod_docente = ? ",docente.doc_vcCodigo);
            registroEnviados registro = query.first();
            query = Disponibilidad.find("cod_docente = ? ",docente.doc_vcCodigo); 
            Disponibilidad disponibilidad = query.first();
            if(registro!=null && disponibilidad!=null){
                envioDiponibilidad dipon = new envioDiponibilidad(docente.id,registro.fecha, 
                        docente.doc_vcCodigo, docente.doc_vcNombres, docente.doc_vcApellidoPaterno,
                        docente.doc_vcApellidoMaterno);
                DC.add(dipon);
            }
         }
        
        if (DC.size()==0) {
            mensaje = "Aun no se han registrado disponibilidades.";
            //PB = 
        } 
        render(DC, mensaje,SA );
    }

    public static void perfilJefe(){
         //Extraemos la fecha de inicio y fin del ciclo academico
        SemestreAcademico SA = SemestreAcademico.find("order by id DESC").first();
        SA2 = SA;
        if(SA==null){
            SA = new SemestreAcademico();
        }
        
        //extraemos los datos del Jefe de Departamento
        Docente JD = Docente.find("doc_vcCodigo","000000").first();
        
        render(JD,SA);
    }
    
    public static void modificarPerfil(String comentario){
         //Extraemos la fecha de inicio y fin del ciclo academico
        SemestreAcademico SA = SemestreAcademico.find("order by id DESC").first();
        SA2 = SA;
        if(SA==null){
            SA = new SemestreAcademico();
        }
        
        //extraemos los datos del Jefe de Departamento
        Docente JD = Docente.find("doc_vcCodigo","000000").first();
        
        render(JD,SA,comentario);
    }
    //Metodo que actualiza la Información del Perfil de Jefe de Departamento
    public static void actualizarPerfil(Docente JD, Long id){
        Docente docenteAnterior = Docente.findById(id);
        String comentario = "",contra1 = params.get("passNuevo1");
        validation.valid(JD);
        if(validation.hasErrors()){
            System.out.println("Se deben completar todos los campos");
        }
        if(docenteAnterior==null){
            System.out.println("No se pudo actualizar, semestre no encontrado.");
        }else { 
            if(docenteAnterior.doc_vcPassword.equals(params.get("passAnterior"))){
                if(contra1.equals(params.get("passNuevo2"))){
                    docenteAnterior.doc_vcPassword = params.get("passNuevo1");
                    docenteAnterior.doc_vcCorreo1= params.get("JD.doc_vcCorreo1");
                    docenteAnterior.doc_vcCorreo2= params.get("JD.doc_vcCorreo2");
                    docenteAnterior.doc_vcCorreo3= params.get("JD.doc_vcCorreo3");
                    docenteAnterior.doc_vcTelefono1= params.get("JD.doc_vcTelefono1");
                    docenteAnterior.doc_vcTelefono2= params.get("JD.doc_vcTelefono2");
                    docenteAnterior.doc_vcTelefono3= params.get("JD.doc_vcTelefono3");
                    docenteAnterior.save(); 
                    
                    comentario = "Se cambió los datos Satisfactoriamente";
                }else{
                    comentario = "La contraseña nueva no coincide";
                }
            }else 
                comentario = "Contaseña Anterior errada !";
        }
       modificarPerfil(comentario);
        
    }
    
    
    public static void buscarPalabra(String campo){
        //Extraemos datos del semestre Academico
        SemestreAcademico SA = SemestreAcademico.find("order by id DESC").first();
        SA2 = SA;
        if(SA==null){
            System.out.println("Esta Vacio.....");
            SA = new SemestreAcademico();
        }
          //extraemos los datos del Jefe de Departamento
        Docente JD = Docente.find("doc_vcCodigo","000000").first();
        
        List<Docente> encontrado = new ArrayList<Docente>();
        if(campo.equals("nombre")){
            encontrado =  Docente.find("doc_vcNombres",params.get("palabra")).fetch();
        }else if(campo.equals("apellido")){
            encontrado = Docente.find("doc_vcApellidoPaterno",params.get("palabra")).fetch();
            List<Docente> encontrado2 = Docente.find("doc_vcApellidoMaterno",params.get("palabra")).fetch();
            encontrado.addAll(encontrado2);
        }else if(campo.equals("codigo")){
            encontrado = Docente.find("doc_vcCodigo",params.get("palabra")).fetch();
        }
       renderTemplate("dptoAcademico/resultadobusqueda.html", encontrado,SA);    
    }
    
    
    public static void exportarExcel() throws WriteException{
        try {
			// Writing Data to ExcelSheet
                        SemestreAcademico SA = SemestreAcademico.find("order by id DESC").first();
                        SimpleDateFormat formato = new SimpleDateFormat("dd-MM-yyyy");
			String filename = "envioDisponibilidad"+SA.sem_vcNombre+".xls";
                        System.out.println(filename);
			WorkbookSettings ws = new WorkbookSettings();
			ws.setLocale(new Locale("es", "PE"));
			WritableWorkbook workbook = Workbook.createWorkbook(new File(
					"public\\export\\"+filename), ws);
			WritableSheet s = workbook.createSheet("Disponibilidad", 0);
			//WritableSheet s1 = workbook.createSheet("ImageSheet", 0);
			writeDataSheet(s);
			//writeImageSheet(s1);
			workbook.write();
			workbook.close();
                        redirect("/public/export/"+filename);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (WriteException e) {
			e.printStackTrace();
		}
    }
    
    private static void writeDataSheet(WritableSheet s) throws WriteException {

		// Writing Data to ExcelSheet
		System.out.println("In writeDataSheet() Method");
		/* Format the Font */
		WritableFont wf = new WritableFont(WritableFont.ARIAL,10,WritableFont.BOLD);
		WritableCellFormat cf = new WritableCellFormat(wf);
		cf.setWrap(true);

		/* Creates Label and writes date to one cell of sheet */
		Label l = new Label(0, 0, "Código", cf);
                s.addCell(l);
                
                l = new Label(1, 0, "Apellidos", cf);
		s.addCell(l);
                
                l = new Label(2, 0, "Nombres", cf);
		s.addCell(l);
                
                l = new Label(3, 0, "E-mail", cf);
		s.addCell(l);
                
                l = new Label(4, 0, "Fecha de envío", cf);
		s.addCell(l);
                int i=0,j=1;
                
                SemestreAcademico SA = SemestreAcademico.find("order by id DESC").first();
                List<Docente> DC = Docente.find("order by id DESC").fetch();
                
                
                if (DC == null) {
                    //mensaje = "Aun no se han registrado semestres.";
                    //PB = 
                } else {
                    
                    WritableCellFormat cf2 = new WritableCellFormat(NumberFormats.DEFAULT);
                    WritableFont wf3 = new WritableFont(WritableFont.TIMES, 10,
				WritableFont.NO_BOLD);
                    WritableCellFormat cf3 = new WritableCellFormat(wf3);
                    cf3.setWrap(true);

                   l = new Label(2, 8, "Nagesh", cf3);
                
                    for (Docente docente : DC) {
                                
                        JPAQuery query  = registroEnviados.find(" cod_docente = ? ",docente.doc_vcCodigo);
                        registroEnviados registro = query.first();
                        query = Disponibilidad.find("cod_docente = ? ",docente.doc_vcCodigo); 
                        Disponibilidad disponibilidad = query.first();
                        if(registro!=null && disponibilidad!=null){
                    
                            l = new Label(i, j, docente.doc_vcCodigo, cf3);
                            s.addCell(l);
                            l = new Label(i+1, j, docente.doc_vcApellidoPaterno + " "+docente.doc_vcApellidoMaterno , cf3);
                            s.addCell(l);
                            l = new Label(i+2, j, docente.doc_vcNombres, cf3);
                            s.addCell(l);
                            l = new Label(i+3, j, docente.doc_vcCorreo1, cf3);
                            s.addCell(l);
                            DateTime dt = new DateTime(i+4, j, new Date(registro.fecha), DateTime.GMT);
                            //l = new Label(i, j+3, registro.fecha+" "+registro.hora , dt);
                            s.addCell(dt);
                            
                            j++;
                        }
                    }
                
                }
	}
    
        public static void mostrarDisponibilidad(Long id){
            System.out.println("id "+ id);
            if(id==null){
                listaDocentes();
            }
         Docente DC = Docente.findById(id);
         SemestreAcademico SA = SemestreAcademico.find("order by id DESC").first();       
            if(SA==null){
                SA = new SemestreAcademico();
            }
            if(DC==null){
                redirect("/");
            }
        
        String periodo = SA.sem_vcNombre;
        String username = DC.doc_vcCodigo;
        
        Docente docente = Docente.connect(username);
        String nombres=docente.doc_vcNombres;
        String apPaterno=docente.doc_vcApellidoPaterno;
        String apMaterno=docente.doc_vcApellidoMaterno;
        
        registroEnviados registro = registroEnviados.connect(username,periodo);
        
        Integer[] array = new Integer[85];
        
        for (int i = 0; i < 85; i++) {
        array[i] = 0;
        }
        
        JPAQuery jpa=Disponibilidad.find("byCod_docenteAndPeriodo_acad",username, periodo);
        Iterator iter = jpa.query.getResultList().iterator();
        while (iter.hasNext()){
        Disponibilidad d = (Disponibilidad) iter.next();  
        array[d.array_index] = 1;
        }
        String fecha = registro.fecha;
        String hora = registro.hora;
        
        render(DC,SA, username,nombres,apPaterno,apMaterno,array,fecha,hora);
             
    }
        
        public static void panelControl(String mensaje) {
         //Extraemos datos del semestre Academico
        SemestreAcademico SA = SemestreAcademico.find("order by id DESC").first();
        SA2 = SA;
        if(SA==null){
            System.out.println("Esta Vacio.....");
            SA = new SemestreAcademico();
        }
          //extraemos los datos del Jefe de Departamento
        Docente JD = Docente.find("doc_vcCodigo","000000").first();
        render(JD,SA, mensaje);
    }
}